#include <iostream>
//#include "../../Indexador/src/Hash/GeneradorHashingPerfecto.cpp"
#include "utiles/StringUtil.h"
//#include "../../Indexador/src/utiles/ArchivosUtil.cpp"
#include "Hash/GeneradorHashingPerfecto.h"
#include "utiles/ArchivosUtil.h"
#include "utiles/BusquedaUtil.h"
#include "compresor/CompresorNumeros.h"

using namespace std;



int main(int argc, char* argv[]) {
	cout << "##################Buscador################" << endl;
	if(argc < 5) {
			std::cout << "Cantidad incorrecta de parametros de entrada" << std::endl;
			std::cout << "Parametros ingresados:"<< argc << std::endl;
			return -1;

	}

	ArchivosUtil arch;
	BusquedaUtil busquedaUtil;
	vector<TerminoBusqueda> vectorBusqueda;
	string nombreIndice=  StringUtil::charToString(argv[2]);
	string query = StringUtil::charToString(argv[4]);
	std::cout << "Busqueda ingresadas: "<< query.c_str()<<endl;
	std::cout << "Nombre del indice: "<< nombreIndice<<endl;

	string nombreArchivoIndiceAux="../archivos/salida/indiceAuxiliar-"+nombreIndice;
	string nombreArchivoIndice="../archivos/salida/indice-"+ nombreIndice;
	ifstream is(nombreArchivoIndiceAux.c_str(),ios::binary);
	ifstream isIndex(nombreArchivoIndice.c_str());

	if(!is.is_open()|| !isIndex.is_open()){
		cout<<"No se encontro el indice "<<nombreIndice<<endl;
		return -1;
	}

	vector<string> terminos;
	terminos= arch.devolverTerminos(query);//("the end.");
	/*for(int i = 0 ; terminos.size();i++){
		printf("%s \n",terminos.at(i).c_str());
	}
	return 0;*/
	vector<string> todasLasPalabras = arch.obtenerTodasPalabras("../archivos/salida/salidasPalabras-"+nombreIndice);
	//terminos.push_back(query);
	CompresorNumeros compNum;
	unsigned int bytesParaSeek=0;
	int index=0;
	GeneradorHashingPerfecto hash(nombreIndice);

	string terminoNoEncontrado;
	for(vector<string>::iterator it=terminos.begin(); it!=terminos.end(); ++it ){
		vector<unsigned int> numerosALlenar;
		string termino=*it;
		index=hash.obtenerIndex(*it);
		if(termino != todasLasPalabras.at(index)){
			terminoNoEncontrado = termino;
			printf("la palabra %s no esta en el indice \n",terminoNoEncontrado.c_str());
			is.close();
			isIndex.close();
			return 0;
		}

		is.seekg(index*4, fstream::beg);
		is.read((char*)&bytesParaSeek, sizeof(bytesParaSeek));
		isIndex.seekg(bytesParaSeek,fstream::beg);
		compNum.descomprimirNumeros(isIndex,numerosALlenar);
		vectorBusqueda.push_back(busquedaUtil.buildTerminoBusqueda(termino,numerosALlenar));
	}

	vector<unsigned int> documentosMatcheados = busquedaUtil.mostrarResultadoBusqueda(vectorBusqueda);
	if(documentosMatcheados.size() > 0){
		printf("los documentos son: \n");
	}else{
		printf("La consulta no existe en ningun documento. \n");
		is.close();
		isIndex.close();
		return 0;
	}
	int sizeMatchers = documentosMatcheados.size();
	for(int i = 0 ; i < sizeMatchers;i++){
		printf("%s ; ",	arch.obtenerNombreDocumento("../archivos/referencias",documentosMatcheados.at(i)).c_str());
	}
	//vectorBusqueda = busquedaUtil.generarTerminoBusqueda();

	/*for (vector<TerminoBusqueda>::iterator it = vectorBusqueda.begin();
			it != vectorBusqueda.end(); ++it) {
		TerminoBusqueda busqueda = *it;
		cout << busqueda.toString() << endl;
	}*/

	is.close();
	isIndex.close();
	return 0;
}


